package estructuras;

/**
 * Clase que instancia los nodos del arbol del sistema logico, 
 * cada nodo representará una compuerta lógica entrelazada
 * por conexiones a las demás.
 * @author Alexandre
 * @author Rodrigo
 * @author Gabriel
 * @author Jeremy
 */

public class ANBNode {
    
    private ANBNode _padre;//Padre del nodo.
    private SLL _hijos;//Lista simple de hijos tipo ANBNode del nodo.
    private String _compuertaName;//Nombre de la compuerta.
    private String _compuertaGraf;//Nombre de la compuerta+su numero respectivo.
    private boolean _comp;//True si es compuerta, false si es entrada
    private int _valor;//Valor de la entrada(para el caso de las entradas(I#) -hojas-). Las entradas reciben por defecto el valor de 0
    private int _posX;//Coordenada X de la compuerta
    private int _posY;//Coordenada Y de la compuerta
    
        
    public ANBNode () {
        _hijos = new SLL();
        _padre = null;
    }
    /**
     * Constructor, Inicializa un nuevo nodo del árbol con la lista de hijos vacía, el
     * noombre respectivo de la compuerta y el nombre con su numero,
     * el padre nulo, define si es compuerta o entrada y su valor inicial en cero.
     * @param pNombreCompuerta Nombre de la compuerta
     * @param pCount Contador para establecer _compuertaGraf con el nombre de la compuerta mas su numero
     * @param pComp True si es compueerta, false si es entrada
     * @param pX Coordenada x a nivel grafico
     * @param pY Coordenada y a nivel grafico
     */
    public ANBNode (String pNombreCompuerta, int pCount, boolean pComp, int pX, int pY) {
        _hijos = new SLL();
        _compuertaName = pNombreCompuerta;
        _compuertaGraf = pNombreCompuerta+pCount;
        _padre = null;
        _comp = pComp;
        _posX = pX;
        _posY = pY;
        
        if (pNombreCompuerta.equals("VCC")) {
            _valor = 1;
        }
        else {
            _valor = 0;
        }
    }
    
    
    ////Getters y setters////
    /**
     * Obtiene la coordenada X de la compuerta
     * @return Posicion X
     */
    public int getPosX() {
        return _posX;
    }

    /**
     * Establece la coordenada X de la compuerta
     */
    public void setPosX(int _posX) {
        this._posX = _posX;
    }

    /**
     * Obtiene la coordenada Y de la compuerta
     * @return Posicion Y
     */
    public int getPosY() {
        return _posY;
    }

    /**
     * Establece la coordenada Y de la compuerta
     */
    public void setPosY(int _posY) {
        this._posY = _posY;
    }
    
    /**
     * Verifica si el nodo representa un componente o una entrada.
     * @return true si es componente, false si es entrada
     */
    public boolean isComp() {
        return _comp;
    }

    /**
     * Establece el valor boolean que verifica si el nodo representa un componente
     * o una entrada.
     * @param pComp true si es componente logico, false si es entrada
     */
    public void setComp(boolean pComp) {
        this._comp = pComp;
    }

    /**
     * Obtiene el valor binario del nodo, si el nodo es una entrada
     * obtiene su valor logico, si es una compuerta lógica, su valor de salida
     * de acuerdo a específicos valores de entradas.
     * @return Valor binario
     */
    public int getValor() {
        return _valor;
    }

    /**
     * Establece el valor binario de una compuerta logica o una entrada.
     * @param pValor Valor binario
     */
    public void setValor(int pValor) {
        this._valor = pValor;
    }
    
     /** Obtiene el nodo padre.
     * @return Nodo padre
     */
    public ANBNode getPadre() {
        return _padre;
    }

    /**
     * Establece el nodo padre.
     * @param pPadre Nodo padre
     */
    public void setPadre(ANBNode pPadre) {
        this._padre = pPadre;
    }

    /**
     * Obtiene la lista simple de hijos enlazados el nodo.
     * @return Lista de hijos enlazados
     */
    public SLL getHijos() {
        return _hijos;
    }

    /**
     * Establece una lista simple de los nodos hijos del nodo.
     * @param pHijos Lista simple de hijos
     */
    public void setHijos(SLL pHijos) {
        this._hijos = pHijos;
    }

    /**
     * Obtiene el nombre de la compuerta que representa este nodo, 
     * este nombre representará el tipo de compuerta lógica y el número de etiqueta.
     * @return Nombre de la comṕuerta lógica
     */
    public String getCompuertaName() {
        return _compuertaName;
    }

    /**
     * Establece un nombre a la compuerta lógica
     * @param pCompuerta Nombre que se quiere para la compuerta
     */
    public void setCompuertaName(String pCompuerta) {
        this._compuertaName = pCompuerta;
    }
    
    /**
     * Obtiene el nombre de la compuerta junto con su numero respectivo al ser creada
     * @return Nombre de la compuerta y numero
     */
    public String getCompuertaGraf() {
        return _compuertaGraf;
    }
    
    /**
     * Establece en nombre de la compuerta concatenado con su numero respectivo.
     * @param pCompuertaMasNumero Nombre de la compuerta y numero concatenado.
     */
    public void setCompuertaGraf(String pCompuertaMasNumero) {
        this._compuertaGraf = pCompuertaMasNumero;
    }
    //////////////////////////////////////////////////////////////
    
    
    /**
     * Inserta un nuevo hijo del nodo a la lista de hijos.
     * @param pHijo Nuevo hijo
     */
    public void agregarHijo(ANBNode pHijo) {
        _hijos.meterFinal(pHijo);
    }
    
}
